/*
 * Copyright (c) 2022, Chongqing UCchip InfoTech Co.,Ltd
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-12-18     jlu          the first version
 */
#ifndef _NET_MQTT_H_
#define _NET_MQTT_H_

#define PROTOCOL_VERSIN "v2.0"

#define MQTT_KEEP_ALIVE_INTERVAL 30
#define MQTT_CLEAN_SESSION 1
#define MQTT_BUFFER_SIZE 3072
#define MQTT_READ_BUFFER_SIZE 3072
#define MQTT_THREAD_STACK_SIZE 4096
#define MQTT_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 3 - 3)

#define MQTT_CACHE_NUM 10
// #define MQTT_CACHE_BUFFER_SIZE (1024 * 5)
#define MQTT_SEND_MAX_SIZE 2500
// 建议长度Suggested length
#define MQTT_SEND_SUGGEST_LEN 1450
#define MQTT_CACHE_TIMEOUT 150
#define MQTT_CACHE_WAIT_TIMEOUT 500

// #define MQTT_RECV_PAGE_MAX_LEN 1500

#ifdef __cplushplus
extern "C"
{
#endif

    typedef struct
    {
        // 用于调试统计，当前缓存json包的个数
        char number;
        // 完整数据标识.1 表示满，0表示没有满
        char full_flag;
        // buf 有效数据长度
        short len;
        // 缓存的数据
        char buf[MQTT_SEND_MAX_SIZE];
    } mqtt_data_cache_t;

    typedef struct
    {
        // 缓存
        mqtt_data_cache_t mqtt_data_cache[MQTT_CACHE_NUM];
        // 写位置
        char write_index;
        // 读位置
        char read_index;
        // 对其预留
        short na;
    } mqtt_data_manager_t;

    // 写缓存数据
    int write_mqtt_data(char *data, int len);

    /**
     * @brief  MQTT 配置
     *
     */
    typedef struct net_mqtt_config
    {
        char url[64];        /**< 服务器 */
        char client_id[32];  /**< 客户ID */
        char username[32];   /**< 用户名 */
        char password[32];   /**< 密码 */
        char sub_topic0[64]; /**< 订阅主题 0 */
        char sub_topic1[64]; /**< 订阅主题 1 */
        char sub_topic2[64]; /**< 订阅主题 2 */
        char pub_topic[64];  /**< 发布主题 */
    } net_mqtt_config_t;

    /**
     * @brief  MQTT 消息
     *
     */
    typedef struct net_mqtt_message
    {
        char *topic;   /**< MQTT 主题 */
        char *payload; /**< MQTT 有效载荷 */
    } net_mqtt_message_t;

    /**
     * @brief  创建 MQTT 消息
     *
     * @param  data 初始化数据
     * @return
     */
    net_mqtt_message_t *create_mqtt_message(const void *data);

    /**
     * @brief  释放 MQTT 消息
     *
     * @param  msg MQTT 消息
     */
    void release_mqtt_message(net_mqtt_message_t *msg);

    /**
     * @brief  创建 net_mqtt 消息队列
     *
     * @return 成功返回0，否则返回非0
     */
    int net_mqtt_create_queue(void);

    /**
     * @brief  获取 net_mqtt 消息队列
     *
     * @return net_mqtt 消息队列
     */
    void *net_mqtt_get_queue(void);

    /**
     * @brief  获取 mqtt_com 消息队列
     *
     * @return mqtt_com 消息队列
     */
    void *mqtt_com_get_queue(void);

    /**
     * @brief  启动 MQTT
     *
     * @return 成功返回0，失败返回非0
     */
    int mqtt_start(void);

    /**
     * @brief  终止 MQTT
     *
     * @return 成功返回0，失败返回非0
     */
    int mqtt_stop(void);

    /**
     * @brief  MQTT 订阅主题
     *
     * @param  argc 参数个数
     * @param  argv 命令行参数
     * @return 成功返回0，失败返回非0
     */
    int mqtt_subscribe(int argc, char **argv);

    /**
     * @brief  MQTT 取消订阅
     *
     * @param  argc 参数个数
     * @param  argv 命令行参数
     * @return 成功返回0，失败返回非0
     */
    int mqtt_unsubscribe(int argc, char **argv);

    /**
     * @brief  MQTT 发布消息
     *
     * @param  argc 参数个数
     * @param  argv 命令行参数
     * @return 成功返回0，失败返回非0
     */
    int mqtt_publish(int argc, char **argv);

    void mqtt_push_checkout(void);

#ifdef __cplushplus
}
#endif // __cplushplus

#endif // _NET_MQTT_H_
